package com.ruoyi.system.service.impl;

import java.util.concurrent.*;


public class NlpcUtilThread {





    BlockingQueue<Runnable> workQueue;//任务队列
    ExecutorService es;//线程池的接口
    Long startTime;//开始时间

    public NlpcUtilThread(Integer corePoolSize, Integer maximumPoolSize) {
        startTime = System.currentTimeMillis();
        /**
         * 构造无界的任务队列，资源足够，理论可以支持无线个任务
         * 不过如果并发量很大的话，最好指定一下队列的长度，否则把所有东西放进队列里面
         * 很可能会导致内存溢出
         */
        workQueue = new LinkedBlockingQueue<>(corePoolSize * 4);

        /**
         * 1、初始化线程数量
         * 2、最大线程
         * 3、线程存活时间
         * 4、时间单位
         * 5、阻塞队列，用来存储等待执行的任务
         * 6、拒绝策略
         */
        es = new ThreadPoolExecutor(corePoolSize, maximumPoolSize,
                60, TimeUnit.SECONDS, workQueue,
                new ThreadPoolExecutor.CallerRunsPolicy());
    }

    public void send(Runnable task) {
        //System.out.println("PoolSend start sending mail...");
        es.execute(task);//将任务放入线程池提交
    }

    public void close() {// 关闭
        es.shutdown();
        while (true) {//等待所有任务都执行结束
            if (es.isTerminated()) {//所有的子线程都结束了
                System.out.println("共耗时:" + (System.currentTimeMillis() - startTime) / 1000 + "s");
                break;
            }
        }
    }



}
